package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Producto;
import veterinaria.modelo.Vacuna;
import veterinaria.util.ConexionBD;

public class VacunaDAO extends BaseDAO {
	
	public Collection<Vacuna> buscarPorNombre(String pNom) throws DAOExcepcion {
		String sqlDoc="Select VacCodigo,VacNombre,VacFlg,MProducto_ProCodigo From TVacuna Where ProNombre Like ?";
		Collection<Vacuna> lisDoc=new ArrayList<Vacuna>();
		Connection conDoc=null;
		PreparedStatement comDoc=null;
		ResultSet rstDoc=null;
		try {
			conDoc=ConexionBD.obtenerConexion();
			comDoc=conDoc.prepareStatement(sqlDoc);
			comDoc.setString(1, "%" + pNom + "%");
			rstDoc=comDoc.executeQuery();
			while (rstDoc.next()) {
				Vacuna regDoc = new Vacuna();
				regDoc.setVacCodigo(rstDoc.getInt("VacCodigo"));
				regDoc.setVacNombre(rstDoc.getString("VacNombre"));
				lisDoc.add(regDoc);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
			
		} finally {
			this.cerrarResultSet(rstDoc);
			this.cerrarStatement(comDoc);
			this.cerrarConexion(conDoc);
		}
		System.out.println(lisDoc.size());
		return lisDoc;
	}
	
	
	public Vacuna insertar(Vacuna pReg) throws DAOExcepcion {
        String cSql = "Insert Into TVacuna(VacNombre,VacFlg,MProducto_ProCodigo) Values (?,?,?)";
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            cCon = ConexionBD.obtenerConexion();
            cCom = cCon.prepareStatement(cSql);
            cCom.setString(1, pReg.getVacNombre());
            cCom.setString(2, pReg.getVacFlg());
            cCom.setInt(3, pReg.getProducto().getProCodigo());
            int nroErr = cCom.executeUpdate();
            if (nroErr != 1) {
                throw new SQLException("No se pudo insertar");
            }
            int newCod = 0;
            cSql="Select Last_Insert_id()";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                newCod=cRst.getInt(1);
            }
            pReg.setVacCodigo(newCod);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return pReg;
    }
	
	public Vacuna obtener(int pCod) throws DAOExcepcion {
        Vacuna cReg = new Vacuna();
        Connection cCon = null;
        PreparedStatement cCom = null;
        ResultSet cRst = null;
        try {
            String query = "Select VacCodigo,VacNombre,VacFlg,MProducto_ProCodigo From TVacuna Where VacCodigo=?";
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(query);
            cCom.setInt(1, pCod);
            cRst=cCom.executeQuery();
            if (cRst.next()) {
                cReg.setVacCodigo(cRst.getInt(1));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return cReg;
    }

	
	public void eliminar(int pCod) throws DAOExcepcion {
        String cSql="Delete From TVacuna Where VacCodigo=?";
        Connection cCon=null;
        PreparedStatement cCom=null;
        try {
            cCon=ConexionBD.obtenerConexion();
            cCom=cCon.prepareStatement(cSql);
            cCom.setInt(1, pCod);
            int i = cCom.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
    }
	
	public Vacuna actualizar(Vacuna pReg) throws DAOExcepcion {
		String cSql="UpDate TVacuna Set VacNombre=?,VacFlg=?,MProducto_ProCodigo=? Where VacCodigo=? And VacFlg<>'E'";
		Connection cCon=null;
		PreparedStatement cCom=null;
		try {
			cCon=ConexionBD.obtenerConexion();
			cCom=cCon.prepareStatement(cSql);
			cCom.setString(1, pReg.getVacNombre());
            cCom.setString(2, pReg.getVacFlg());
            cCom.setString(3, "M");
            cCom.setInt(4, pReg.getProducto().getProCodigo());
            int i = cCom.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
		return pReg;
	}
	
	
	public Collection<Vacuna> listar() throws DAOExcepcion {
        Collection<Vacuna> c = new ArrayList<Vacuna>();
        Connection cCon=null;
        PreparedStatement cCom=null;
        ResultSet cRst=null;
        try {
            cCon = ConexionBD.obtenerConexion();
            String cSql="Select a.VacCodigo,a.VacNombre,a.VacFlg,a.MProducto_ProCodigo,b.ProNombre From TVacuna a, MProducto b Where a.MProducto_ProCodigo=b.ProCodigo";
            cCom=cCon.prepareStatement(cSql);
            cRst=cCom.executeQuery();
            while (cRst.next()) {
                Vacuna cVac = new Vacuna();
                Producto cPro=new Producto();
                cVac.setVacNombre(cRst.getString("VacNombre"));
                cVac.setVacFlg(cRst.getString("VacFlg"));
                cPro.setProCodigo(cRst.getInt("MProducto_ProCodigo"));
                cPro.setProNombre(cRst.getString("ProNombre"));
                cVac.setProducto(cPro);
                c.add(cVac);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(cRst);
            this.cerrarStatement(cCom);
            this.cerrarConexion(cCon);
        }
        return c;
    }    
	
	
	

}
